Die referenzielle Transparenz besagt, dass ein Ausdruck mit seinem Wert ersetzt werden kann, ohne das Verhalten des Programms zu ändern. Dies bedeutet, dass der Ausdruck pur ist, also für gleiche Eingabewerte das gleiche Ergebnis liefert und keine Seiteneffekte hat.[1] Dies ist eine wichtige Eigenschaft des funktionalen Programmierparadigmas.
Außerdem ermöglicht dies Programmtransformationen, also die Ersetzung von aufwändig durch einfach zu berechnende Ausdrücke.
Das Prinzip der referenziellen Transparenz wirft aber auch Probleme auf. So ist das einfache Auslesen eines mit der Tastatur eingegebenen Zeichens nicht direkt möglich; solch eine Funktion – wie getchar
in C – ist nicht erlaubt. Jedes Mal wäre der Rückgabewert abhängig von der Eingabe des Benutzers. Damit entstünden Kommunikationsprobleme mit der Umgebung.
So werden z. B. in der funktionalen Programmiersprache Haskell Aktionen, die mit der Umgebung interagieren können, als Werte des Datentyps IO
beschrieben. Mittels spezieller Operatoren können aus elementaren Aktionsbeschreibungen komplexe Beschreibungen konstruiert werden. Jedes Haskell-Programm definiert eine Variable main
, deren Wert eine Aktionsbeschreibung des gesamten Programms ist. Aktionen können ausgeführt werden, indem ihre Beschreibung in den Wert von main
eingebettet wird.